using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using TestImport.Printen;
using System.Data.SqlClient;
using CPrintReportStringDemo;
using System.Collections;

namespace TestImport.Lijsten
{

    class BoekenLijst
    {
        private enum j { boekid = 0, titel, isbn, categorie, boeklijst, voorraad, huurboek, llbes, llretour, llafhaal, platobes, platoannul, platoretour, platolever };
        private SqlConnection con;
        private SqlCommand com;
        private SqlDataReader reader;
        private string welkeBoeken;
        private string zoek;
        private string welkeLijst;
        private string welkeSort;
        private bool metPositieveVoorraad;
        private bool metPositieveNogTeLeveren;
        private bool metExtraTitel;
        private bool metNieuwBlad;
        private string[,] info;
        private StringBuilder sb;
        private bool HorizontaleLijnen;
        public string hulpje = "";
        public string titel;
        public string subTitel;
        public string subTitel2;
        public List<int> afstanden = new List<int>();
        

        public BoekenLijst(string welkeBoeken, string zoek, string welkeLijst, string welkeSort,bool metPositieveVoorraad,bool metPositieveNogTeLeveren, bool metNieuwBlad, bool HorizontaleLijnen, bool metExtraTitel)
        {
            con = new SqlConnection(Properties.Settings.Default.TestImportConnectionString);
            sb = new StringBuilder();
            this.welkeBoeken = welkeBoeken;
            this.zoek = zoek;
            this.welkeLijst = welkeLijst;
            this.welkeSort = welkeSort;
            this.metPositieveVoorraad = metPositieveVoorraad;
            this.metPositieveNogTeLeveren = metPositieveNogTeLeveren;
            this.metNieuwBlad = metNieuwBlad;
            this.HorizontaleLijnen = HorizontaleLijnen;
            this.metExtraTitel = metExtraTitel;
            vulInfoArray();
        }

        public StringBuilder getTePrinten()
        {
            return sb;
        }



        public string[,] vulInfoArray()
        {
            int tel = 0;
            info = new string[0,14];
            string queryUitteVoeren = "SELECT boekID, categorieCode, isbnNr, titel, voorraad1 FROM Boek WHERE (boekID IN (SELECT DISTINCT boekID FROM BoeklijstItem))";
            if (welkeBoeken.Equals("categorie"))
                queryUitteVoeren += " AND categoriecode = " + "'" + zoek + "'";
            if (welkeBoeken.Equals("boekenlijst"))
            {
                string vBoeklijstID = "0";
                string hulpQuery = "SELECT boeklijstID FROM boeklijst WHERE groepCode = " + "'" + zoek + "'";
                try
                {
                    com = new SqlCommand(hulpQuery, con);
                    con.Open();
                    reader = com.ExecuteReader();
                    if (reader.HasRows)
                    {
                        reader.Read();
                        vBoeklijstID = reader["boeklijstID"].ToString();
                    }
                    reader.Close();
                    con.Close();
                }
                catch (Exception) { con.Close(); }
                queryUitteVoeren = "SELECT boekID, categorieCode, isbnNr, titel, voorraad1 FROM Boek WHERE (boekID IN (SELECT boekID FROM BoeklijstItem WHERE boeklijstID = " + "'" + vBoeklijstID + "'" + "))";
            }
            if (welkeSort.Equals("titel")) queryUitteVoeren += " ORDER BY titel";
            if (welkeSort.Equals("categorie")) queryUitteVoeren += " ORDER BY categorieCode, titel";
            string fout = "????";
            try
            {

                com = new SqlCommand(queryUitteVoeren, con);
                con.Open();
                reader = com.ExecuteReader();
                while (reader.Read()) { tel++; }
                info = new string[tel, 14];
                reader.Close();
                reader = com.ExecuteReader();
                hulpje = tel + " " + Environment.NewLine;
                int i = 0;
                while (reader.Read())
                {
                    info[i, (int)j.titel] = reader["titel"].ToString();
                    info[i, (int)j.isbn] = reader["isbnNr"].ToString();
                    info[i, (int)j.boekid] = reader["boekID"].ToString();
                    info[i, (int)j.categorie] = reader["categorieCode"].ToString();
                    info[i, (int)j.voorraad] = reader["voorraad1"].ToString();
                    info[i, (int)j.boeklijst] = "???";
                    info[i, (int)j.llafhaal] = "0";
                    info[i, (int)j.llbes] = "0";
                    info[i, (int)j.llretour] = "0";
                    info[i, (int)j.platoannul] = "0";
                    info[i, (int)j.platobes] = "0";
                    info[i, (int)j.platolever] = "0";
                    info[i, (int)j.platoretour] = "0";
                    info[i, (int)j.huurboek] = "0";
                    i++;
                   // hulpje += reader["titel"].ToString() + Environment.NewLine;
                }
                reader.Close();
                con.Close();
            }
            catch (Exception ex) { fout = ex.Message; reader.Close(); con.Close(); }
            if (tel > 0)
            {
                string queryLijst = "";
                if (welkeLijst.Equals("leerlingInfo") || welkeLijst.Equals("voorraad"))
                {
                    queryLijst = "SELECT  boekID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, groepCode, categorieCode, huurboek FROM Lijst_Leerling_LeerlingBoek";
                    if (welkeBoeken.Equals("categorie"))
                        queryLijst += " WHERE categorieCode = " + "'" + zoek + "'";
                    //if (welkeBoeken.Equals("boekenlijst"))
                        //queryLijst += " WHERE groepCode = " + "'" + zoek + "'";
                    try
                    {
                        com = new SqlCommand(queryLijst, con);
                        con.Open();
                        reader = com.ExecuteReader();
                        string vBoekID = "0";
                        int hulp = 0;
                        while (reader.Read())
                        {
                            vBoekID = reader["boekID"].ToString();
                            for (int i = 0; i < tel - 1; i++)
                            {
                                if (info[i, (int)j.boekid].Equals(vBoekID))
                                {
                                    info[i, (int)j.boeklijst] = reader["groepCode"].ToString();
                                    if (bool.Parse(reader["huurboek"].ToString()))
                                        info[i, (int)j.huurboek] = "1";
                                    if (!reader["datumBestelling"].ToString().Equals(DBNull.Value.ToString()))
                                    {
                                        hulp = int.Parse(info[i, (int)j.llbes]) + 1;
                                        info[i, (int)j.llbes] = hulp.ToString();
                                    }
                                    if (!reader["datumRetour"].ToString().Equals(DBNull.Value.ToString()))
                                    {
                                        hulp = int.Parse(info[i, (int)j.llretour]) + 1;
                                        info[i, (int)j.llretour] = hulp.ToString();
                                    }
                                    if (!reader["datumAfhaling"].ToString().Equals(DBNull.Value.ToString()))
                                    {
                                        hulp = int.Parse(info[i, (int)j.llafhaal]) + 1;
                                        info[i, (int)j.llafhaal] = hulp.ToString();
                                    }
                                    break;
                                }
                            }
                        }
                        reader.Close();
                        con.Close();
                    }
                    catch (Exception) { reader.Close(); con.Close(); }
                }

                queryLijst = "";
                if (welkeLijst.Equals("platoInfo") || welkeLijst.Equals("voorraad") || welkeLijst.Equals("nogTeLeveren"))
                {
                    queryLijst = "SELECT boekID, datumBestelling,isPlato, isRetour, isAnnulatie, bestellingNaam, opmerkingIntern, aantalBesteld FROM LijstBestellingen";
                    if (welkeBoeken.Equals("categorie"))
                        queryLijst += " WHERE categorieCode = " + "'" + zoek + "'";
                    int aantal = 0;
                    try
                    {
                        com = new SqlCommand(queryLijst, con);
                        con.Open();
                        reader = com.ExecuteReader();
                        string vBoekID = "0";
                        int hulp = 0;
                        while (reader.Read())
                        {
                            vBoekID = reader["boekID"].ToString();
                            for (int i = 0; i < tel - 1; i++)
                            {
                                if (info[i, (int)j.boekid].Equals(vBoekID))
                                {
                                    aantal = Math.Abs(int.Parse(reader["aantalBesteld"].ToString()));
                                    if (bool.Parse(reader["isRetour"].ToString()))
                                    {
                                        hulp = int.Parse(info[i, (int)j.platoretour]) + aantal;
                                        info[i, (int)j.platoretour] = hulp.ToString();
                                    }
                                    else
                                    {
                                        if (bool.Parse(reader["isAnnulatie"].ToString()))
                                        {
                                            hulp = int.Parse(info[i, (int)j.platoannul]) + aantal;
                                            info[i, (int)j.platoannul] = hulp.ToString();
                                        }
                                        else
                                        {
                                            hulp = int.Parse(info[i, (int)j.platobes]) + aantal;
                                            info[i, (int)j.platobes] = hulp.ToString();
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                        reader.Close();
                        con.Close();
                    }
                    catch (Exception) { reader.Close(); con.Close(); }

                    queryLijst = "";
                    if (welkeLijst.Equals("platoInfo") || welkeLijst.Equals("voorraad") || welkeLijst.Equals("nogTeLeveren"))
                    {
                        queryLijst = "SELECT boekID, datumLevering ,isPlato, categoriecode, leveringNaam, opmerking, aantal FROM LijstLevering";
                        if (welkeBoeken.Equals("categorie"))
                            queryLijst += " WHERE categorieCode = " + "'" + zoek + "'";
                        aantal = 0;
                        try
                        {
                            com = new SqlCommand(queryLijst, con);
                            con.Open();
                            reader = com.ExecuteReader();
                            string vBoekID = "0";
                            int hulp = 0;
                            while (reader.Read())
                            {
                                vBoekID = reader["boekID"].ToString();
                                for (int i = 0; i < tel - 1; i++)
                                {
                                    if (info[i, (int)j.boekid].Equals(vBoekID))
                                    {
                                        aantal = Math.Abs(int.Parse(reader["aantal"].ToString()));
                                        hulp = int.Parse(info[i, (int)j.platolever]) + aantal;
                                        info[i, (int)j.platolever] = hulp.ToString();
                                        break;
                                    }
                                }
                            }
                            reader.Close();
                            con.Close();
                        }
                        catch (Exception) { reader.Close(); con.Close(); }
                    }
                }

            }//endif tel>0
            //if (welkeSort.Equals("boekenlijst")) sorteerInfo();
            maakTekst();
            return info;
        }

        private void sorteerInfo()
        {
            string [] hulp = new string [14];
            string h = "";
            int aantal = info.GetLength(0);
            for (int i = 1; i < aantal; i++)
            {
                for (int k = 0; k < aantal - i;k++)//info.GetLength(0); k++)
                {
                    if ((info[i, (int)j.boeklijst].CompareTo(info[k, (int)j.boeklijst]) < 0))
                   // if ((info[i, (int)j.boeklijst].CompareTo(info[k, (int)j.boeklijst]) > 0) ||
                   //   (info[i, (int)j.boeklijst].CompareTo(info[k, (int)j.boeklijst]) == 0 &&
                   //      info[i, (int)j.titel].CompareTo(info[k, (int)j.titel]) > 0))
                    {
                        //hulpje += "bingo " + info[i, (int)j.boeklijst]+ info[k, (int)j.boeklijst]+Environment.NewLine;
                        /*for (int z = 0; z < 14; z++) hulp[z] = info[i, z];
                        for (int z = 0; z < 14; z++) info[i, z] = info[k, z];
                        for (int z = 0; z < 14; z++) info[k, z] = hulp[z];*/
                        h = info[i, (int)j.boeklijst];
                        info[i, (int)j.boeklijst] = info[k, (int)j.boeklijst];
                        info[k, (int)j.boeklijst] = h;
                    }
                }
            }   
        }

        public void maakTitels()
        {
            afstanden = new List<int>();
            afstanden.Add(15); afstanden.Add(70); afstanden.Add(6);
            string basisSubTitel = "ISBN".PadRight(15) +
                         "Titel".PadRight(70) +
                         "Cat".PadRight(6);
            string basisSubTitel2 = "".PadRight(91);
            if (welkeLijst.Equals("leerlingInfo"))
            {
                titel = "Bestellingen, afhalingen en retours van leerlingen";
                basisSubTitel +=
                         "Bestelling".PadLeft(12) +
                         "Afhaling".PadLeft(12) +
                         "Retour".PadLeft(12);
                afstanden.Add(14); afstanden.Add(12); afstanden.Add(12);
            }
            if (welkeLijst.Equals("platoInfo"))
            {
                titel = "Bestellingen, annulaties, retours en leveringen van PLATO";
                basisSubTitel +=
                         "Bestelling".PadLeft(12) +
                         "Annulatie".PadLeft(12) +
                         "Retour".PadLeft(12) +
                         "Levering".PadLeft(12);
                afstanden.Add(14); afstanden.Add(12); afstanden.Add(12); afstanden.Add(12);
            }
            if (welkeLijst.Equals("voorraad"))
            {
                titel = "Voorraadlijst";
                basisSubTitel += "Begin".PadLeft(10) +
                          "Levering".PadLeft(10) +
                          "Afhaling".PadLeft(10) +
                          "Retour".PadLeft(10) +
                          "Retour".PadLeft(10) +
                          "Eind".PadLeft(10);
                basisSubTitel2 += "voorraad".PadLeft(10) +
                          "Plato".PadLeft(10) +
                          "leerling".PadLeft(10) +
                          "Plato".PadLeft(10) +
                          "leerling".PadLeft(10) +
                          "voorraad".PadLeft(10);
                afstanden.Add(12); afstanden.Add(10); afstanden.Add(10); afstanden.Add(10); afstanden.Add(10); afstanden.Add(10);
            }
            if (welkeLijst.Equals("nogTeLeveren"))
            {
                titel = "Lijst nog te leveren";
                basisSubTitel += "Besteld".PadLeft(12) +
                             "Geannuleerd".PadLeft(12) +
                             "Geleverd".PadLeft(12) +
                             "Te leveren".PadLeft(12);
                afstanden.Add(14); afstanden.Add(12); afstanden.Add(12); afstanden.Add(12);
            }
            if (welkeBoeken.Equals("categorie")) titel+=" van categorie "+zoek;
            if (welkeBoeken.Equals("boekenlijst")) titel+=" van boekenlijst "+zoek;
            if (welkeSort.Equals("categorie")) titel+=" geordend per categorie";
            else titel += " geordend op titel";
            subTitel = basisSubTitel;
            subTitel2 = basisSubTitel2;
        }

        private void maakTekst()
        {
            //maximum aantal lijnen voor bladsprong
            int maxAantalLijnen = 49;
            if (HorizontaleLijnen) maxAantalLijnen = 37;
            if (metExtraTitel) maxAantalLijnen --;
            maakTitels();
            int hsaldo = 0;
            string basis = "";

            int blznr = 0;
            
            string vorigeCategorie = "????";
            string lijn = "";
            int aLijnen = 0;
            bool magDetailLijn = true;

            for (int i = 0; i < info.GetLength(0); i++)
            {
                 magDetailLijn = true;
                 basis = info[i, (int)j.isbn].PadRight(15) +
                         info[i, (int)j.titel].PadRight(70) +
                         info[i, (int)j.categorie].PadRight(6);
                 if (!info[i, (int)j.categorie].Equals(vorigeCategorie) && welkeSort.Equals("categorie"))
                 {
                     aLijnen = 0;
                     vorigeCategorie = info[i, (int)j.categorie];
                     if (welkeSort.Equals("categorie") && metNieuwBlad && blznr > 0)
                     {
                         lijn = "<:NEWPAGE>" + Environment.NewLine;
                         sb.Append(lijn);
                     }

                     blznr++;
                 }
                 if (welkeSort.Equals("categorie") && aLijnen == 0)
                 {
                        string categorieString = Environment.NewLine+"Categorie:" + vorigeCategorie;
                        lijn = categorieString;
                        if (!HorizontaleLijnen) sb.Append("<:LINES>" + Environment.NewLine);
                        sb.Append("<:FONTBOLD>" + Environment.NewLine);
                        sb.Append(lijn + Environment.NewLine);
                        sb.Append("<:FONTNORMAL>" + Environment.NewLine);
                        if (!HorizontaleLijnen) sb.Append("<:NOLINES>" + Environment.NewLine);
                        
                 }
                 aLijnen++;
                 if (welkeLijst.Equals("leerlingInfo"))
                 {
                     lijn = basis +
                                  info[i, (int)j.llbes].PadLeft(12) +
                                  info[i, (int)j.llafhaal].PadLeft(12) +
                                  info[i, (int)j.llretour].PadLeft(12) +
                                  Environment.NewLine;
                 }
                 if (welkeLijst.Equals("platoInfo"))
                 {
                     lijn = basis +
                                 info[i, (int)j.platobes].PadLeft(12) +
                                 info[i, (int)j.platoannul].PadLeft(12) +
                                 info[i, (int)j.platoretour].PadLeft(12) +
                                 info[i, (int)j.platolever].PadLeft(12) +
                                 Environment.NewLine;
                    }
                 if (welkeLijst.Equals("voorraad"))
                 {
                      magDetailLijn = false;
                      hsaldo = int.Parse(info[i, (int)j.voorraad]) +
                                int.Parse(info[i, (int)j.platolever]) -
                                int.Parse(info[i, (int)j.llafhaal]) -
                                int.Parse(info[i, (int)j.platoretour]) +
                                int.Parse(info[i, (int)j.llretour]);
                      if (!metPositieveVoorraad || metPositieveVoorraad && hsaldo > 0)
                      {
                          magDetailLijn = true;
                          lijn = basis + info[i, (int)j.voorraad].PadLeft(10) +
                                   info[i, (int)j.platolever].PadLeft(10) +
                                   info[i, (int)j.llafhaal].PadLeft(10) +
                                   info[i, (int)j.platoretour].PadLeft(10) +
                                   info[i, (int)j.llretour].PadLeft(10) +
                                   hsaldo.ToString().PadLeft(10) +
                                   Environment.NewLine;
                      }
                 }
                 if (welkeLijst.Equals("nogTeLeveren"))
                 {
                     magDetailLijn = false;
                     hsaldo = int.Parse(info[i, (int)j.platobes]) -
                               int.Parse(info[i, (int)j.platoannul]) -
                               int.Parse(info[i, (int)j.platolever]);
                     if (!metPositieveNogTeLeveren || metPositieveNogTeLeveren && hsaldo > 0)
                     {
                         magDetailLijn = true;
                         lijn = basis + info[i, (int)j.platobes].PadLeft(12) +
                               info[i, (int)j.platoannul].PadLeft(12) +
                               info[i, (int)j.platolever].PadLeft(12) +
                               hsaldo.ToString().PadLeft(12) +
                               Environment.NewLine;
                     }
                 }
                        //lijn += Environment.NewLine;
                 if (aLijnen > maxAantalLijnen)
                 { 
                     sb.Append("<:NEWPAGE>" + Environment.NewLine);
                     aLijnen = 1;
                 }
                
                 if (aLijnen == 1)
                 {
                     if (welkeLijst.Equals("voorraad"))
                     {
                        
                         sb.Append("<:FONTBOLD>" + Environment.NewLine);
                         sb.Append(subTitel + Environment.NewLine);
                         if (!HorizontaleLijnen) sb.Append("<:LINES>" + Environment.NewLine);
                         sb.Append(subTitel2 + Environment.NewLine);
                         sb.Append("<:FONTNORMAL>" + Environment.NewLine);
                         if (!HorizontaleLijnen) sb.Append("<:NOLINES>" + Environment.NewLine);
                     }
                     else
                     {
                         if (!HorizontaleLijnen) sb.Append("<:LINES>" + Environment.NewLine);
                         sb.Append("<:FONTBOLD>" + Environment.NewLine);
                         sb.Append(subTitel + Environment.NewLine);
                         sb.Append("<:FONTNORMAL>" + Environment.NewLine);
                         if (!HorizontaleLijnen) sb.Append("<:NOLINES>" + Environment.NewLine);
                     }
                 }
                 if (magDetailLijn) sb.Append(lijn);
             }
        }
    }
     
}
